package com.controller;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @ClassName : Test07_MyWebSocket
 * @Auther : acerolan@foxmail.com
 * @Data : 2024/7/25 15:56
 * @Description :
 */


//单例类
@ServerEndpoint(value = "/websocket/{userId}")
@Component
public class WebSocket {

    public WebSocket() {
        System.out.println("实例化");
    }

    /**concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。*/
    private static ConcurrentHashMap<String, WebSocket> webSocketMap = new ConcurrentHashMap<>();

    /**与某个客户端的连接会话，需要通过它来给客户端发送数据*/
    private Session session;

    /**接收userId*/
    private String userId="";

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        System.out.println("OnOpen: 用户"+this.userId+"连接/启动");
        this.userId = userId;//连接成功就把用户的id保存起来，为后续的关闭及发送消息使用
        this.session = session;
        this.webSocketMap.put(userId, this);

//        System.out.println(userId+"用户连接服务器成功"+session.getId());
        try {
            sendMessage("连接成功: 用户"+this.userId+"; Session Id: ");//发送给客户端
        } catch (IOException e) {
        }
    }

    @OnClose
    public void onClose() {
        System.out.println("OnClose: 用户"+this.userId+"断开/关闭");
    }

    /**
     * 客户端主动发送消息后调用的方法
     *
     * @param message 客户端发送过来的消息*/
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("用户：" + this.userId);
        System.out.println("消息：" + message);
        try {
            // 为null说明对方未连接websocket, 将消息存入数据库
            if (this.webSocketMap.get("2") == null) {
                System.out.println("NULL");
            } else {
                this.webSocketMap.get("2").session.getBasicRemote().sendText(message);
            }
        } catch (IOException e) {
        }
    }
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println(this.userId+"错误");
        error.printStackTrace();
    }
    /**
     * 自己封装的方法  服务器发送信息给客户端
     */
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
}
